\bibliographystyle{gbt7714-2005}

\chapter{数据的导入与导出} % (fold)
\label{cha:数据的导入与导出}

相对于数据统计而言，数据的录入或者导入工作虽然简单，但非常繁琐和耗时。

\section{在R中录入数据} % (fold)
\label{sec:在r中录入数据}
在R中，我们可以使用edit命令用电子表格的形式编辑、录入数据，但要求编辑的数据已经存在或已被定义。\cite{AndriedeVriesJorisMeys，2017}例如：

\begin{lstlisting}
elements <- data.frame()
elements <- edit(elements)
\end{lstlisting}

命令运行后，会启动R电子表格对话框，可以进行交互编辑，如图\ref{fig:dataEditor}：
\begin{figure}
\centering
\includegraphics[width=60mm]{Raw/dataEditor.png}
\caption{R数据编辑界面}
\label{fig:dataEditor}
\end{figure}

编辑完成后，关闭窗口会自动保存数据并传回到R。这种方式虽然看似简单，但其功能较弱，并不建议使用这种方式录入大量数据。

\section{在Excel中录入数据} % (fold)
\label{sec:在excel中录入数据}
与在SPSS和R中录入数据相比，在Excel软件中录入数据，有一些要求：

\begin{enumerate}
    \item 所有的数据应该在一个表中。
    \item 变量名称应该在表的第一行。
    \item 变量名中不能有特殊字符、空格。
    \item 不能有空行。
    \item 在原始数据中应该有问卷编号或者id这样的变量，方便数据清理。
    \item 除非必须，否则都应使用数字代表选项，比如，用1代表男性，0代表女性。
    \item 缺失值不要填入任何内容，留空即可。
    \item 日期使用“月/日/年”格式。
    \item 不要忘记定时存盘及备份数据，重要数据一定要有网络备份。
\end{enumerate}

在遵守以上规则的同时，我们还可以利用Excel的一些特性，高质量的完成数据录入工作：

\begin{enumerate}
    \item 避免在Excel中使用排序功能，以免混乱数据。若需排序，则一定要全部数据排序。
    \item ID的值可以通过拖动自动生成。
    \item 可通过设置数据的有效性，来防止输入错误。参见图\ref{fig:valider}。
    \item 数据输入的过程中难免会出错误，为最大限度的降低录入数据时的错误，我们最好确保同一份问卷由不同的录入人员分别录入。Excel可以方便得对比，以发现不同录入人员在同一值上的区别。将不同人员录入的表，分别放在sheet1和sheet2中，然后在sheet3中，输入公式\code{=IF(sheet1!A1=sheet2!A1,1,0)}，将其自动填充到所有有效区域，即可方便得看出录入的不同地方。
\end{enumerate}

\begin{figure}
\centering
\includegraphics[width=120mm]{Raw/valider.png}
\caption{Excel数据验证设置}
\label{fig:valider}
\end{figure}
% section 在excel中录入数据 (end)
\section{导入外部数据} % (fold)
\label{sec:导入外部数据}
以下介绍如何导入常见格式的外部文件。
\subsection{导入txt文件} % (fold)
\label{sub:导入txt文件}
有时候，我们需要导入txt格式的文件，R对.txt格式的文件有一些要求：
\begin{enumerate}
    \item 首行应该为变量名称。
    \item 变量、值之间应该用符号隔开，这些符号常见的有空格、分号等等。
    \item 中文以utf格式存储。
    \item 缺失值以NA表示。
\end{enumerate}

只要格式符号要求，就可以使用read.table导入到R中：

\begin{lstlisting}
> recodes = read.table("/Users/yangjh/document/works/ci/收益率.txt",header = T,fileEncoding = "UTF-16")
> class(recodes)
[1] "data.frame"
> recodes
     买入日期 股票名称 买入数量 买入价格 实际卖出价格
1   2014/12/3 中信证券      300    19.63        25.35
2   2014/12/3 民生银行     1000     8.49        10.41
3   2014/12/5 深圳能源      700    10.16        11.70
4   2014/12/5 中国平安      100    62.40        63.20
\end{lstlisting}

read.table函数导入后以数据框的结构存储数据，必须要指定文件存放路径及名称，header参数为真，将以第一行的数据为变量名称。如果文件中有中文，还要指定文件的编码方式。

\subsection{导入csv文件} % (fold)
\label{sub:导入csv文件}
和txt文件类似，导入csv文件也需要csv文件本身符合如下规则：
\begin{enumerate}
    \item 首行应该为变量名称。
    \item 变量、值之间应该用符号隔开。
    \item 中文以utf格式存储。\footnote{在 OS X中，Excel存储csv格式时，无法指定编码方式，可通过苹果Numbers 导出为utf编码的csv文件。}
    \item 缺失值以NA表示。
\end{enumerate}

可以使用read.table或者read.csv函数，read.csv函数其实就是read.table函数。

\begin{lstlisting}
> recodes = read.csv("/Users/yangjh/document/works/ci/收益率/复利计算.csv",header = T,fileEncoding = "UTF-8")
> recodes
         本金 追加本金 收益率           资产
1     300,000             20%    JP¥ 360,000
2     360,000   20,000    20%    JP¥ 456,000
3     456,000   20,000    20%    JP¥ 571,200
4     571,200   20,000    20%    JP¥ 709,440
\end{lstlisting}

\subsection{导入Excel文件} % (fold)
\label{sub:导入excel文件}

若要在R中使用Excel的数据，有很多种办法，可以将其转换为txt或者csv文件，也可以使用扩展包来直接获取Excel的内容，用来读取Excel文件的扩展包较多，常用openxlsx扩展包：

\begin{lstlisting}
> install.packages('openxlsx')
> library(openxlsx)
> demo <- read.xlsx("/Users/yangjh/document/works/ci/收益率.xlsx")
> demo
       本金 追加本金 收益率     资产
1    300000       NA    0.2   360000
2    360000    20000    0.2   456000
3    456000    20000    0.2   571200
4    571200    20000    0.2   709440
5    709440    20000    0.2   875328
6    875328    20000    0.2  1074394
\end{lstlisting}

使用这种方法，避免了csv文件的导出及中文编码的转换问题，并且数值及时间等内容更符合使用习惯。

其中\code{install.packages('openxlsx')}安装好之后，以后再导入Excel文件就无需执行。

另外，还可以在Excel中将文件打开，观察数据结构后将其复制到剪切板，然后一样可以使用\code{read.table('clipboard')}导入到R里。

\subsection{导入SPSS文件} % (fold)
\label{sub:导入spss文件}
导入SPSS文件和导入Excel文件类似，可以将其转为csv格式或用剪切板的方式。当然，也可以使用扩展包直接打开，考虑到中文编码问题，我们建议使用haven扩展包：

\begin{lstlisting}
install.packages('haven')
library(haven)
read_sav("mtcars.sav")
\end{lstlisting}


\section{导出数据} % (fold)
\label{sec:导出数据}

导出数据大多采用csv格式，white.table函数可以完成需求。

\begin{lstlisting}
> write.table(data, "/Users/yangjh/Downloads/数据/80222-80231.csv", fileEncoding = "UTF-8")
\end{lstlisting}


\bibliography{../bib/yangjh}
